修改文件有二種方法,一種是把文件裡的所有資料,都暫時存到記憶體裡,找到要修改的文字,然後再回存至文件裡,就像vim
一樣,另一種是rename
的方式,也就是建立另一個新的文件,然後修改完原本的文件後,寫入至新文件,那我們就來實做第二種方式
準備好二個文件,一個是foo
裡面要有內容,另一個新文件是空的 - foo.bak
foo文件內容如下
柯文哲扮演1位到西門町刺青的Rocker,但因實在太怕痛而刺不下去
而柯文哲還以為是真的要在身上刺青
還說「啊?是真的要刺下去嗎?我還沒跟我老婆報備呢。」
foo.bak文件內容如下
要把『是真的要刺下去嗎』
修改成 『不是真的要刺下去吧』
,並寫入至foo.bak
那要怎麼做咧?
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
f = open("foo", "r", encoding="utf-8")
f_new = open("foo.bak", "w", encoding="utf-8")
for line in f:
if "是真的要刺下去嗎" in line:
line = line.replace("是真的要刺下去嗎", "不是真的要刺下去吧")
f_new.write(line)
else:
f_new.write(line)
f.close()
f_new.close()
f = open("foo", "r", encoding="utf-8")
只用讀取模式找到要修改的字符串f_new = open("foo.bak", "w", encoding="utf-8")
用寫入模式,是把上面找到修改後的字符串寫入至新文件裡if "是真的要刺下去嗎" in line:
先找出要修改的字符串replace()
來做修改字符串可以優化成下面代碼
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
f = open("foo.txt", "r", encoding="utf-8")
f_new = open("foo.bak", "w", encoding="utf-8")
for line in f:
if "是真的要刺下去嗎" in line:
line = line.replace("是真的要刺下去嗎", "不是真的要刺下去吧")
f_new.write(line)
f.close()
f_new.close()
觀察一下foo.bak文件內容
柯文哲扮演1位到西門町刺青的Rocker,但因實在太怕痛而刺不下去
而柯文哲還以為是真的要在身上刺青
還說「啊?不是真的要刺下去吧?我還沒跟我老婆報備呢。」
嗯!確實已經修改了,但上面的代碼,還是寫的不夠好,因為是寫死的,那如果我想讓用戶自已輸入想要替換的文字,那要怎麼做呢?
請在Terminal中執行 $python3 sed.py 是真的要刺下去嗎 不是真的要刺下去吧
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import sys
find_sys = sys.argv[1]
replace_sys = sys.argv[2]
f = open("foo.txt", "r", encoding="utf-8")
f_new = open("foo.bak", "w", encoding="utf-8")
for line in f:
if find_sys in line:
line = line.replace(find_sys, replace_sys)
f_new.write(line)
f.close()
f_new.close()
在執行這代碼前,先砍掉foo.bak
,確認不存在後,再執行上面的代碼,然後觀察一下是不是真的有替換了
今天是聖誕節,還在參加鐵人賽…暈阿,幸好還有五天,快結束了 Orz